/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controlador;

import Dao.ColaboradorJpaController;
import Dao.CompetenciaJpaController;
import Dao.CompiteJpaController;
import Dao.DeportistaJpaController;
import Dao.DisciplinaJpaController;
import Dao.EspacioDeportivoJpaController;
import Dao.PersonaApoyoJpaController;
import Dao.exceptions.IllegalOrphanException;
import Dao.exceptions.NonexistentEntityException;
import Dao.exceptions.PreexistingEntityException;
import Logica.Colaborador;
import Logica.Competencia;
import Logica.Compite;
import Logica.CompitePK;
import Logica.Deportista;
import Logica.Disciplina;
import Logica.EspacioDeportivo;
import Logica.PersonaApoyo;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author Invitado
 */
public class ControladorCompetencia {

    private EntityManagerFactory factory;
    private ConnectionFactory connection;
    private CompetenciaJpaController daoCompetencia;
    private EspacioDeportivoJpaController daoEspacioDeportivo;
    private DisciplinaJpaController daoDisciplina;
    private ColaboradorJpaController daoColaborador;
    private PersonaApoyoJpaController daoPersonalApoyo;
    private DeportistaJpaController daoDeportista;
    private CompiteJpaController daoCompite;
    
    public ControladorCompetencia() {
        this.connection = ConnectionFactory.getFactory();
        this.factory = connection.getFactoria();
        this.daoCompetencia = new CompetenciaJpaController(factory);
        this.daoEspacioDeportivo = new EspacioDeportivoJpaController(factory);
        this.daoDisciplina = new DisciplinaJpaController(factory);
        this.daoColaborador = new ColaboradorJpaController(factory);
    }

    public boolean guardarCompetencia(String nombre, String descripcion, Date fecha, int cantidadGeneral, int cantidadPlatino, int cantidadVip, int costoGeneral, int costoPlatino, int costoVip, String idEspacio, String idDisciplina) {
        boolean exito = true;
        Random aleatorio = new Random();
        String idCompetencia = ""+ aleatorio.nextInt();
        Competencia competencia = new Competencia();
        EspacioDeportivo espacio;
        Disciplina disciplina;

        espacio = this.daoEspacioDeportivo.findEspacioDeportivo(idEspacio);
        disciplina = this.daoDisciplina.findDisciplina(idDisciplina);

        competencia.setIdCompetencia(idCompetencia);
        competencia.setNombre(nombre);
        competencia.setDescripcion(descripcion);
        competencia.setFecha(fecha);
        competencia.setCantidadGeneral(cantidadGeneral);
        competencia.setCantidadPlatino(cantidadPlatino);
        competencia.setCantidadVip(cantidadVip);
        competencia.setCostoGeneral(costoGeneral);
        competencia.setCostoPlatino(costoPlatino);
        competencia.setCostoVip(costoVip);
        competencia.setColaboradorCollection(new ArrayList<Colaborador>());
        competencia.setIdEspacio(espacio);
        competencia.setIdDisciplina(disciplina);

        while(this.daoCompetencia.findCompetencia(idCompetencia)!=null)
        {
            idCompetencia = ""+aleatorio.nextInt();
            competencia.setIdCompetencia(idCompetencia);
        }
        
        try {
            this.daoCompetencia.create(competencia);
        } catch (PreexistingEntityException ex) {
            exito = false;
        } catch (Exception ex) {
            exito = false;
        }
        return exito;
    }

    public boolean editarCompetencia(String idCompetencia, String nombre, String descripcion, Date fecha, int cantidadGeneral, int cantidadPlatino, int cantidadVip, int costoGeneral, int costoPlatino, int costoVip, String idEspacio, String idDisciplina) {
        boolean exito = true;
        Competencia competencia = new Competencia();
        EspacioDeportivo espacio;
        Disciplina disciplina;

        espacio = this.daoEspacioDeportivo.findEspacioDeportivo(idEspacio);
        disciplina = this.daoDisciplina.findDisciplina(idDisciplina);

        competencia.setIdCompetencia(idCompetencia);
        competencia.setNombre(nombre);
        competencia.setDescripcion(descripcion);
        competencia.setFecha(fecha);
        competencia.setCantidadGeneral(cantidadGeneral);
        competencia.setCantidadPlatino(cantidadPlatino);
        competencia.setCantidadVip(cantidadVip);
        competencia.setCostoGeneral(costoGeneral);
        competencia.setCostoPlatino(costoPlatino);
        competencia.setCostoVip(costoVip);
        competencia.setColaboradorCollection(new ArrayList<Colaborador>());
        competencia.setPersonaApoyoCollection(new ArrayList<PersonaApoyo>());
        competencia.setIdEspacio(espacio);
        competencia.setIdDisciplina(disciplina);

        try {
            this.daoCompetencia.edit(competencia);
        } catch (PreexistingEntityException ex) {
            exito = false;
        } catch (Exception ex) {
            exito = false;
        }
        return exito;
    }

    public boolean eliminarCompetencia(String idCompetencia) {
        boolean exito = true;
        try {
            this.daoCompetencia.destroy(idCompetencia);
        } catch (NonexistentEntityException ex) {
            exito = false;
        } catch (IllegalOrphanException ex) {
            Logger.getLogger(ControladorCompetencia.class.getName()).log(Level.SEVERE, null, ex);
            exito=false;
        }
        return exito;
    }

    public List<Competencia> consultarCompetencias() {
        return this.daoCompetencia.findCompetenciaEntities();
    }

    public Competencia consultarCompetencia(String idCompetencia) {
        Competencia competencia;
        competencia = this.daoCompetencia.findCompetencia(idCompetencia);
        return competencia;
    }

    public boolean agregarArbitrosACompetencia(String idArbitro, String idCompetencia) {
        boolean exito = true;
        Colaborador colaborador = this.daoColaborador.findColaborador(idArbitro);
        Competencia competencia = this.daoCompetencia.findCompetencia(idCompetencia);

        ArrayList<Colaborador> colaboradores = (ArrayList<Colaborador>) competencia.getColaboradorCollection();
        colaboradores.add(colaborador);
        competencia.setColaboradorCollection(colaboradores);
        try {
            this.daoCompetencia.edit(competencia);
        } catch (NonexistentEntityException ex) {
            exito = false;
        } catch (Exception ex) {
            exito = false;
        }

        return exito;
    }

    public boolean eliminarArbitroACompetencia(String idArbitro, String idCompetencia) {
        boolean exito = true;
        ArrayList<Colaborador> colaboradores;
        Colaborador colaborador = this.daoColaborador.findColaborador(idArbitro);
        Competencia competencia = this.daoCompetencia.findCompetencia(idCompetencia);

        colaboradores = (ArrayList<Colaborador>) competencia.getColaboradorCollection();
        colaboradores.remove(colaborador);
        competencia.setColaboradorCollection(colaboradores);
        try {
            this.daoCompetencia.edit(competencia);
        } catch (NonexistentEntityException ex) {
            exito = false;
        } catch (Exception ex) {
            exito = false;
        }

        return exito;
    }
    
    public boolean agregarPersonalApoyoACompetencia(String idPersona, String idCompetencia) {
        boolean exito = true;
        PersonaApoyo persona = this.daoPersonalApoyo.findPersonaApoyo(idPersona);
        Competencia competencia = this.daoCompetencia.findCompetencia(idCompetencia);

        ArrayList<PersonaApoyo> personalApoyo = (ArrayList<PersonaApoyo>) competencia.getPersonaApoyoCollection();
        personalApoyo.add(persona);
        competencia.setPersonaApoyoCollection(personalApoyo);
        try {
            this.daoCompetencia.edit(competencia);
        } catch (NonexistentEntityException ex) {
            exito = false;
        } catch (Exception ex) {
            exito = false;
        }

        return exito;
    }
    
    public boolean eliminarPersonalApoyoACompetencia(String idPersona, String idCompetencia) {
        boolean exito = true;
        PersonaApoyo persona = this.daoPersonalApoyo.findPersonaApoyo(idPersona);
        Competencia competencia = this.daoCompetencia.findCompetencia(idCompetencia);

        ArrayList<PersonaApoyo> personalApoyo = (ArrayList<PersonaApoyo>) competencia.getPersonaApoyoCollection();
        personalApoyo.remove(persona);
        competencia.setPersonaApoyoCollection(personalApoyo);
        try {
            this.daoCompetencia.edit(competencia);
        } catch (NonexistentEntityException ex) {
            exito = false;
        } catch (Exception ex) {
            exito = false;
        }

        return exito;
    }
    
    public boolean agregarCompetidorACompetencia(String idDeportista, String idCompetencia)
    {
        boolean exito = true;
        Deportista deportista = this.daoDeportista.findDeportista(idDeportista);
        Competencia competencia = this.daoCompetencia.findCompetencia(idCompetencia);
        Compite relacion = new Compite();
        CompitePK llave = new CompitePK();
        
        llave.setIdCompetencia(idCompetencia);
        llave.setIdDeportista(idDeportista);
        
        relacion.setCompitePK(llave);
        relacion.setCompetencia(competencia);
        relacion.setDeportista(deportista);
        relacion.setFase("Clasificación");
        relacion.setPuntaje(0);
        
        ArrayList<Compite> relacionesCompetencia = (ArrayList<Compite>) competencia.getCompiteCollection();
        
        relacionesCompetencia.add(relacion);
        competencia.setCompiteCollection(relacionesCompetencia);
        
        try {
            this.daoCompetencia.edit(competencia);
        } catch (NonexistentEntityException ex) {
            exito = false;
        } catch (Exception ex) {
            exito = false;
        }

        return exito;
    }
    
    public boolean eliminarCompetidorACompetencia(String idDeportista, String idCompetencia)
    {
        boolean exito = true;        
        CompitePK llave = new CompitePK();
        
        llave.setIdCompetencia(idCompetencia);
        llave.setIdDeportista(idDeportista);
        
        
        try {
            this.daoCompite.destroy(llave);
        } catch (NonexistentEntityException ex) {
            exito = false;
        } catch (Exception ex) {
            exito = false;
        }

        return exito;
    }
    
    public boolean registrarPuntajes(String idDeportista, String fase, int puntos, String idCompetencia)
    {
        boolean exito = true;
        CompitePK llave = new CompitePK();
        Compite relacion;
        
        llave.setIdCompetencia(idCompetencia);
        llave.setIdDeportista(idDeportista);
        
        relacion = this.daoCompite.findCompite(llave);
        relacion.setFase(fase);
        relacion.setPuntaje(puntos);
        try 
        {
            this.daoCompite.edit(relacion);
        } 
        catch (NonexistentEntityException ex) 
        {
            exito=false;
        } 
        catch (Exception ex) 
        {
            exito=false;
        }
        
        return exito;       
    }

}
